package br.com.ViewDAV;

import br.com.TelaPrincipal.Fr_Principal;
import br.com.ViewBuscaProduto.BuscaProduto;
import br.com.ViewCliente.BuscaCliente;
import br.com.ViewPRE_VENDA.Pre_Vendas_Aberto;
import br.com.controler.*;
import br.com.modelo.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import util.Biblioteca;
import util.Relatorios;
import util.Utilitario;

/**
 *
 * @author Gilberto 13/06/2012
 */
public class Fr_DAV extends javax.swing.JInternalFrame {

    List<Produto> listProduto = new ArrayList<>();
    DavCabecalho dav = null;
    PreVendaCabecalho preVenda = null;
    DavDetalhe davDetalhe = new DavDetalhe();
    Produto produto = new Produto();
    //variaveis de controle
    BigDecimal totalVenda = new BigDecimal(0);
    DecimalFormat df = new DecimalFormat("0.##");
    NumberFormat decimal = NumberFormat.getCurrencyInstance();
    Timestamp time = new Timestamp(new Date().getTime());
    DateFormat hora = new SimpleDateFormat("hh:mm:ss");
    private static Boolean cpjOuCnpjInvalido = false;
    private String tipo = "DAV";

    public Fr_DAV() {
        super();
        initComponents();
        // ocultando a coluna do codigo do produto
        jTable1.getColumnModel().removeColumn(jTable1.getColumnModel().getColumn(0));

        //atalhso botões
        CancelaAction cancelaAction = new CancelaAction();
        btCancela.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancelaAction");
        btCancela.getActionMap().put("cancelaAction", cancelaAction);

        ConfirmaAction confirmaAction = new ConfirmaAction();
        btConfirma.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0), "confirmaAction");
        btConfirma.getActionMap().put("confirmaAction", confirmaAction);

        buscaProdutoAction buscaAction = new buscaProdutoAction();
        rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), "buscaAction");
        rootPane.getActionMap().put("buscaAction", buscaAction);

        DAVsEmAbertoAction davAberto = new DAVsEmAbertoAction();
        rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F6, 0), "davAbertoAction");
        rootPane.getActionMap().put("davAbertoAction", davAberto);

        AlternaTipoAction alteranaTipo = new AlternaTipoAction();
        rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "alteranaTipoAction");
        rootPane.getActionMap().put("alteranaTipoAction", alteranaTipo);

        clienteAction clientAction = new clienteAction();
        rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0), "clienteAction");
        rootPane.getActionMap().put("clienteAction", clientAction);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        textGtin = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        textDescrProduto = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        textCodigoInterno = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        textVlrUnit = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        textQtd = new javax.swing.JTextField();
        jPanel3 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        textTotal = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        textNomeCLiente = new javax.swing.JTextField();
        textCPFCNPJ = new javax.swing.JTextField();
        btCancela = new javax.swing.JButton();
        btConfirma = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setIconifiable(true);
        setTitle("Emissão de DAV(Documento Auxiliar de Venda)");
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true), "Adicionar Item no DAV"));
        jPanel2.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel1.setText("Código de Barras");
        jPanel2.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 20, -1, -1));

        textGtin.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                textGtinFocusLost(evt);
            }
        });
        textGtin.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                textGtinKeyPressed(evt);
            }
        });
        jPanel2.add(textGtin, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 40, 110, -1));

        jLabel2.setText("Descrição ");
        jPanel2.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(240, 20, -1, -1));

        textDescrProduto.setEditable(false);
        textDescrProduto.setFocusable(false);
        jPanel2.add(textDescrProduto, new org.netbeans.lib.awtextra.AbsoluteConstraints(240, 40, 330, -1));

        jLabel3.setText("Código Interno ");
        jPanel2.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 20, -1, -1));

        textCodigoInterno.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                textCodigoInternoFocusLost(evt);
            }
        });
        jPanel2.add(textCodigoInterno, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 40, 100, -1));

        jLabel4.setText("Vlr.Unit.");
        jPanel2.add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(580, 20, -1, -1));

        textVlrUnit.setEditable(false);
        textVlrUnit.setFocusable(false);
        jPanel2.add(textVlrUnit, new org.netbeans.lib.awtextra.AbsoluteConstraints(580, 40, 70, -1));

        jLabel5.setText("QTD");
        jPanel2.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(660, 20, -1, -1));

        textQtd.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                textQtdKeyPressed(evt);
            }
        });
        jPanel2.add(textQtd, new org.netbeans.lib.awtextra.AbsoluteConstraints(660, 40, 60, -1));

        jPanel1.add(jPanel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 45, 730, 80));

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true), "Produto Adicionados"));

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Código Barras", "Código Interno", "Descrição", "Preço de venda", "Qtd", "Total", "UN"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setRowHeight(20);
        jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jTable1.getTableHeader().setReorderingAllowed(false);
        jTable1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jTable1KeyPressed(evt);
            }
        });
        jScrollPane1.setViewportView(jTable1);
        jTable1.getColumnModel().getColumn(1).setMinWidth(125);
        jTable1.getColumnModel().getColumn(1).setPreferredWidth(125);
        jTable1.getColumnModel().getColumn(1).setMaxWidth(125);
        jTable1.getColumnModel().getColumn(2).setMinWidth(100);
        jTable1.getColumnModel().getColumn(2).setPreferredWidth(100);
        jTable1.getColumnModel().getColumn(2).setMaxWidth(100);
        jTable1.getColumnModel().getColumn(4).setMinWidth(100);
        jTable1.getColumnModel().getColumn(4).setPreferredWidth(100);
        jTable1.getColumnModel().getColumn(4).setMaxWidth(100);
        jTable1.getColumnModel().getColumn(5).setMinWidth(50);
        jTable1.getColumnModel().getColumn(5).setPreferredWidth(50);
        jTable1.getColumnModel().getColumn(5).setMaxWidth(50);
        jTable1.getColumnModel().getColumn(6).setMinWidth(80);
        jTable1.getColumnModel().getColumn(6).setPreferredWidth(80);
        jTable1.getColumnModel().getColumn(6).setMaxWidth(80);
        jTable1.getColumnModel().getColumn(7).setMinWidth(0);
        jTable1.getColumnModel().getColumn(7).setPreferredWidth(0);
        jTable1.getColumnModel().getColumn(7).setMaxWidth(0);

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 720, Short.MAX_VALUE)
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 243, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 6, Short.MAX_VALUE))
        );

        jPanel1.add(jPanel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 130, 730, 270));

        textTotal.setFont(new java.awt.Font("Felix Titling", 1, 20)); // NOI18N
        textTotal.setText("0,00");
        textTotal.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel1.add(textTotal, new org.netbeans.lib.awtextra.AbsoluteConstraints(580, 400, 150, 40));

        jLabel7.setText("Total: ");
        jPanel1.add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(530, 400, 50, 40));

        jLabel6.setText("Nome do Cliente: ");
        jPanel1.add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(170, 5, 120, -1));

        jLabel8.setText("CPF/CNPJ do Cliente: ");
        jPanel1.add(jLabel8, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 5, -1, -1));
        jPanel1.add(textNomeCLiente, new org.netbeans.lib.awtextra.AbsoluteConstraints(160, 20, 360, -1));

        textCPFCNPJ.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                textCPFCNPJFocusLost(evt);
            }
        });
        jPanel1.add(textCPFCNPJ, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 20, 140, -1));

        btCancela.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/imgBotoes/botaoCancelar.png"))); // NOI18N
        btCancela.setText("Cancela DAV (ESC)");
        btCancela.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btCancelaActionPerformed(evt);
            }
        });
        jPanel1.add(btCancela, new org.netbeans.lib.awtextra.AbsoluteConstraints(480, 445, 210, -1));

        btConfirma.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/imgBotoes/botaoConfirmar.png"))); // NOI18N
        btConfirma.setText("Finaliza DAV (F12)");
        btConfirma.setEnabled(false);
        btConfirma.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btConfirmaActionPerformed(evt);
            }
        });
        jPanel1.add(btConfirma, new org.netbeans.lib.awtextra.AbsoluteConstraints(270, 445, 210, -1));

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/imgBotoes/botaoLocalizar.png"))); // NOI18N
        jButton1.setText("DAVs em Aberto (F6)");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jPanel1.add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(50, 445, 220, -1));

        jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/imgBotoes/botaoLocalizar.png"))); // NOI18N
        jButton2.setText("Buscar (F3)");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        jPanel1.add(jButton2, new org.netbeans.lib.awtextra.AbsoluteConstraints(530, 20, 160, -1));

        jTabbedPane1.addTab("Emissão de DAV", jPanel1);

        getContentPane().add(jTabbedPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 740, 510));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void textGtinFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_textGtinFocusLost
        BuscaProdutoBanco();
    }//GEN-LAST:event_textGtinFocusLost

    private void textCodigoInternoFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_textCodigoInternoFocusLost
        BuscaProdutoBanco();
    }//GEN-LAST:event_textCodigoInternoFocusLost

    private void textGtinKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_textGtinKeyPressed
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            BuscaProdutoBanco();
        }
    }//GEN-LAST:event_textGtinKeyPressed

    private void textQtdKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_textQtdKeyPressed
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            if (!textVlrUnit.getText().equals("")) {
                if (Double.parseDouble(textQtd.getText()) > 0.00) {
                    adicionaProdutoNaTabela(produto, textQtd.getText());
                    limpaCamposInsercaoProduto();
                    produto = null;
                } else {
                    JOptionPane.showMessageDialog(null, "Quantidade inválida!!", "mensagem do sistema!!", JOptionPane.WARNING_MESSAGE);
                }
            }
        }
    }//GEN-LAST:event_textQtdKeyPressed

    private void jTable1KeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTable1KeyPressed
        if (evt.getKeyCode() == KeyEvent.VK_DELETE) {
            evt.consume();
            //calculando valor total
            AbstractTableModel modelo = (AbstractTableModel) jTable1.getModel();
            String totalTabela = ((String) modelo.getValueAt(jTable1.getSelectedRow(), 6)).replace("R$ ", "").trim();//id do produto
            BigDecimal tot = new BigDecimal(totalTabela.replace(".", "").replace(",", "."));
            totalVenda = totalVenda.subtract(tot);
            textTotal.setText(decimal.format(totalVenda).toString());
            //botao de finalização
            if (totalVenda.intValue() > 0) {
                btConfirma.setEnabled(true);
            } else {
                btConfirma.setEnabled(false);

            }
            //excluido a linha da tabela
            DefaultTableModel tblRemove = (DefaultTableModel) jTable1.getModel();
            Integer linha = jTable1.getSelectedRow();
            tblRemove.removeRow(linha);
        }
    }//GEN-LAST:event_jTable1KeyPressed

    private void btCancelaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCancelaActionPerformed
        sair();
    }//GEN-LAST:event_btCancelaActionPerformed

    private void btConfirmaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btConfirmaActionPerformed
        finaliza();
    }//GEN-LAST:event_btConfirmaActionPerformed

    private void textCPFCNPJFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_textCPFCNPJFocusLost
        validaCnpjCpf();
        if (cpjOuCnpjInvalido) {
            Cliente cliente = ClienteControler.retornaClientePorCpfCnpj(textCPFCNPJ.getText());
            if (cliente != null) {
                textNomeCLiente.setText(cliente.getNome());
            }
        }
    }//GEN-LAST:event_textCPFCNPJFocusLost

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        atalhoF6();
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        selecionaCliente();
    }//GEN-LAST:event_jButton2ActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btCancela;
    private javax.swing.JButton btConfirma;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextField textCPFCNPJ;
    private javax.swing.JTextField textCodigoInterno;
    private javax.swing.JTextField textDescrProduto;
    private javax.swing.JTextField textGtin;
    private javax.swing.JTextField textNomeCLiente;
    private javax.swing.JTextField textQtd;
    private javax.swing.JLabel textTotal;
    private javax.swing.JTextField textVlrUnit;
    // End of variables declaration//GEN-END:variables

    private void limpaCamposInsercaoProduto() {
        textCodigoInterno.setText("");
        textDescrProduto.setText("");
        textGtin.setText("");
        textQtd.setText("");
        textVlrUnit.setText("");
    }

    private void BuscaProdutoBanco() {
        if (!textGtin.getText().equals("")) {
            produto = ProdutoControler.retornaProdutoPorCodigoBarras(textGtin.getText());
            if (produto != null) {
                populaDadosProduto(produto);
            }
        } else if (!textCodigoInterno.getText().equals("")) {
            produto = ProdutoControler.retornaProdutoPorCodigoInterno(textCodigoInterno.getText());
            if (produto != null) {
                populaDadosProduto(produto);
            }
        }
//        produto = new Produto();
    }

    private void populaDadosProduto(Produto prod) {
        Double vlUnit = Double.parseDouble(prod.getValorVenda().toString());
        textGtin.setText(prod.getGtin());
        textCodigoInterno.setText(prod.getCodigoInterno());
        textDescrProduto.setText(prod.getDescricao());
        textVlrUnit.setText(vlUnit.toString());
        textQtd.setText("1");
        textQtd.selectAll();
        textQtd.requestFocus();
    }

    private void adicionaProdutoNaTabela(Produto prod, String qtd) {
        Double qtde = Double.parseDouble(qtd);
        DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
        if (prod != null) {
            modelo.addRow(new String[]{"" + prod.getId(),
                        prod.getGtin(),
                        prod.getCodigoInterno(),
                        prod.getDescricao(),
                        decimal.format(prod.getValorVenda()).toString(),
                        qtde.toString(),
                        decimal.format(prod.getValorVenda().multiply(new BigDecimal(qtde))).toString(),
                        prod.getIdUnidadeProduto().getNome()});
        }

        textGtin.requestFocus();
        totalVenda = totalVenda.add(prod.getValorVenda().multiply(new BigDecimal(qtde)));
        textTotal.setText(decimal.format(totalVenda));
        if (totalVenda.intValue() > 0) {
            btConfirma.setEnabled(true);
        } else {
            btConfirma.setEnabled(false);
        }
    }

    private void adicionaProdutoAlterando(List<DavDetalhe> list) {
        NumberFormat decimais = NumberFormat.getInstance();
        DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
        if (!list.isEmpty()) {
            for (DavDetalhe prod : list) {
                Produto p = ProdutoControler.retornaProdutoPorId(prod.getIdProduto());
                modelo.addRow(new String[]{prod.getIdProduto().toString(),
                            prod.getGtinProduto(),
                            p.getCodigoInterno().toString(),
                            prod.getNomeProduto(),
                            decimal.format(prod.getValorUnitario()).toString(),
                            decimais.format(prod.getQuantidade()).toString(),
                            decimal.format(prod.getValorUnitario().multiply(prod.getQuantidade())).toString(),
                            prod.getUnidadeProduto()});
                totalVenda = totalVenda.add(prod.getValorTotal());
                textTotal.setText(decimal.format(totalVenda));
            }
        }

        textGtin.requestFocus();
        if (totalVenda.intValue() > 0) {
            btConfirma.setEnabled(true);
        } else {
            btConfirma.setEnabled(false);
        }
    }

    private void cancelaDavAtual() {
        String[] opcoes = {"Sim", "Não"};
        int escolha = JOptionPane.showOptionDialog(null, "Deseja cancela o DAV Atual?", "Pergunta do Sistema",
                JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,
                null, opcoes, null);
        if (escolha == JOptionPane.YES_OPTION) {
            totalVenda = new BigDecimal(0);
            limpaTabela();
            textTotal.setText(decimal.format(0.00));
        }
    }

    private void validaCnpjCpf() {
        Boolean val = Biblioteca.validaCpfCnpj(textCPFCNPJ.getText().trim());
        if (val) {
            cpjOuCnpjInvalido = true;
        } else {
            cpjOuCnpjInvalido = false;
            JOptionPane.showMessageDialog(null, "Cpf ou CNPJ informado é inválido!!", "Mensagem do sistema", JOptionPane.ERROR_MESSAGE);
        }

    }

    private void finaliza() {
        String[] opcoes = {"Sim,Confirmo", "Cancelar"};
        switch (tipo) {
            case "DAV": {
                int escolha = JOptionPane.showOptionDialog(null, "Confirma Finalizar o DAV?", "Mensagem do Sistema",
                        JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,
                        null, opcoes, null);
                if (escolha == JOptionPane.YES_OPTION) {
                    finalizaDAV();
                }
                break;
            }
            case "PRE-VENDA": {
                int escolha = JOptionPane.showOptionDialog(null, "Confirma Finalizar a PRE-VENDA?", "Mensagem do Sistema",
                        JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,
                        null, opcoes, null);
                if (escolha == JOptionPane.YES_OPTION) {
                    finalizaPRE_VENDA();
                }
                break;
            }
        }
    }

    private void verificaTipoVenda() {
        switch (tipo) {
            case "DAV":
                tipo = "PRE-VENDA";
                break;
            case "PRE-VENDA":
                tipo = "DAV";
                break;
        }

        switch (tipo) {
            case "DAV":
                jTabbedPane1.addTab("Emissão de DAV", jPanel1);
                setTitle("Emissão de DAV(Documento Auxiliar de Venda)");
                //BOTÕES
                jButton1.setText("DAVs em Aberto (F6)");
                btCancela.setText("Cancela DAV (ESC)");
                btConfirma.setText("Finaliza DAV (F12)");
                break;
            case "PRE-VENDA":
                jTabbedPane1.addTab("Emissão de PRÉ-VENDA", jPanel1);
                setTitle("Emissão de PRÉ-VENDA");
                //BOTÕES
                jButton1.setText("PRÉ-VENDA em Aberto (F6)");
                btCancela.setText("Cancela PRÉ-VENDA (ESC)");
                btConfirma.setText("Finaliza PRÉ-VENDA (F12)");
                break;
        }
    }

    private void atalhoF6() {
        switch (tipo) {
            case "DAV":
                DAVs_Aberto davs = new DAVs_Aberto(null, true);
                davs.setVisible(true);
                if (davs.altera) {
                    dav = davs.getDav();
                    adicionaProdutoAlterando(dav.getItensDav());
                    textCPFCNPJ.setText(dav.getCpfCnpjDestinatario());
                    textNomeCLiente.setText(dav.getNomeDestinatario());
                }
                davs.altera = false;
                break;
            case "PRE-VENDA":
                Pre_Vendas_Aberto PV = new Pre_Vendas_Aberto(null, true);
                PV.setVisible(true);
                if (PV.altera) {
                    preVenda = PV.getPreVenda();
                    adicionaProdutoAlterandoPreVenda(preVenda.getItensPreVenda());
                    if (preVenda.getCliente() != null) {
                        textCPFCNPJ.setText(preVenda.getCliente().getCpfCnpj());
                        textNomeCLiente.setText(preVenda.getCliente().getNome());
                    }
                }
                PV.altera = false;
                break;
        }
    }

    private void limpaTabela() {
        while (jTable1.getRowCount() > 0) {
            DefaultTableModel tblRemove = (DefaultTableModel) jTable1.getModel();
            tblRemove.removeRow(0);
        }
    }

    private class buscaProdutoAction extends AbstractAction {

        public buscaProdutoAction() {
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            BuscaProduto bp = new BuscaProduto(null, true);
            bp.setVisible(true);
            if (bp.getProduto() != null) {
                if (!bp.getProduto().toString().equals("")) {
                    produto = ProdutoControler.retornaProdutoPorId(Integer.parseInt(bp.getProduto()));
                    populaDadosProduto(produto);
                }
            }
        }
    }

    private class ConfirmaAction extends AbstractAction {

        public ConfirmaAction() {
        }

        public void actionPerformed(ActionEvent e) {
            finaliza();
        }
    }

    private class CancelaAction extends AbstractAction {

        public CancelaAction() {
        }

        public void actionPerformed(ActionEvent e) {
            sair();
        }
    }

    private class AlternaTipoAction extends AbstractAction {

        public AlternaTipoAction() {
        }

        public void actionPerformed(ActionEvent e) {
            verificaTipoVenda();
        }
    }

    private class clienteAction extends AbstractAction {

        public clienteAction() {
        }

        public void actionPerformed(ActionEvent e) {
            selecionaCliente();
        }
    }

    private class DAVsEmAbertoAction extends AbstractAction {

        public DAVsEmAbertoAction() {
        }

        public void actionPerformed(ActionEvent e) {
            atalhoF6();
        }
    }

    private void sair() {
        if (jTable1.getRowCount() == 0) {
            String[] opcoes = {"Sim", "Não"};
            int escolha = JOptionPane.showOptionDialog(null, "Deseja sair do DAV?", "Pergunta do Sistema",
                    JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,
                    null, opcoes, null);
            if (escolha == JOptionPane.YES_OPTION) {
                Fr_Principal.dav = null;
                dispose();
            }
        } else if (jTable1.getRowCount() > 0) {
            cancelaDavAtual();
        }
    }

    private void finalizaDAV() {
        AbstractTableModel modelo = (AbstractTableModel) jTable1.getModel();
        if (textCPFCNPJ.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Informe o CPF ou CNPJ do cliente!");
            textCPFCNPJ.requestFocus();
        } else if (textNomeCLiente.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Informe o nome do cliente!");
            textNomeCLiente.requestFocus();
        } else if (!cpjOuCnpjInvalido) {
            JOptionPane.showMessageDialog(null, "Cpf ou CNPJ informado é inválido!!", "Mensagem do sistema", JOptionPane.ERROR_MESSAGE);
            textCPFCNPJ.requestFocus();
        } else {
            Integer idDavAlteracao;
            String numDAV = null;
            if (dav != null) {
                idDavAlteracao = dav.getId();
                numDAV = dav.getNumeroDav();
                if (idDavAlteracao != null) {
                    DavCabecalho d = DavCabecalhoControler.retornaDavPorId(idDavAlteracao);
                    if (d != null) {
                        d.delete();
                    }
                }
            }
            dav = new DavCabecalho();
            dav.setCpfCnpjDestinatario(textCPFCNPJ.getText());
            dav.setNomeDestinatario(textNomeCLiente.getText());
            dav.setDataEmissao(new Date());
            dav.setSituacao('P');
            dav.setTaxaAcrescimo(new BigDecimal(0));
            dav.setAcrescimo(new BigDecimal(0));
            dav.setTaxaDesconto(new BigDecimal(0));
            dav.setDesconto(new BigDecimal(0));
            dav.setSubtotal(new BigDecimal(0));
            dav.setHoraEmissao(hora.format(time));
            dav.setValor(totalVenda);
            if (numDAV != null) {
                dav.setNumeroDav(numDAV);
            } else {
                dav.setNumeroDav(DavCabecalhoControler.retornaNumeroDav());
            }
            dav.setHashIncremento(-1);

            //itens do dav
            for (int x = 0; x < jTable1.getRowCount(); x++) {
                DavDetalhe dvDet = new DavDetalhe();
                String idProduto = ((String) modelo.getValueAt(x, 0));//id do produto
                String descrProduto = ((String) modelo.getValueAt(x, 3));//id do produto
                String gtin = ((String) modelo.getValueAt(x, 1));//id do produto
                String qtd = ((String) modelo.getValueAt(x, 5));//quantidade
                String vlrUnit = ((String) modelo.getValueAt(x, 4)).replace("R$ ", "").trim();//quantidade
                String Unidade = ((String) modelo.getValueAt(x, 7));//quantidade
                BigDecimal vlrUnitario = new BigDecimal(vlrUnit.replace(".", "").replace(",", "."));
                dvDet.setIdDavCabecalho(dav);
                dvDet.setIdProduto(Integer.parseInt(idProduto));
                if (numDAV != null) {
                    dvDet.setNumeroDav(numDAV);
                } else {
                    dvDet.setNumeroDav(DavCabecalhoControler.retornaNumeroDav());
                }
                dvDet.setDataEmissao(new Date());
                dvDet.setItem(x);
                dvDet.setQuantidade(new BigDecimal(qtd));
                dvDet.setValorUnitario(vlrUnitario);
                dvDet.setValorTotal(vlrUnitario.multiply(new BigDecimal(qtd)));
                dvDet.setCancelado('N');
                dvDet.setMesclaProduto('N');
                dvDet.setGtinProduto(gtin);
                dvDet.setNomeProduto(descrProduto);
                dvDet.setHashIncremento(-1);
                dvDet.setUnidadeProduto(Unidade);
                dav.getItensDav().add(dvDet);
            }
            dav = dav.salvar();

            limpaTabela();
            String[] opcoes = {"Sim,Imprimir", "Não imprimir"};
            int escolha = JOptionPane.showOptionDialog(null, "DAV salvo com sucesso!:\n\n"
                    + "Número DAV: " + dav.getNumeroDav() + "\n"
                    + " ID do DAV: " + dav.getId() + "\n\n"
                    + "Deseja imprimir?", "Mensagem do Sistema",
                    JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,
                    null, opcoes, null);
            if (escolha == JOptionPane.YES_OPTION) {
                Relatorios.geraRelatorioDAV("imprimir", dav.getId());
            }
            //inicializando os objetos
            totalVenda = new BigDecimal(0);
            davDetalhe = new DavDetalhe();
            textTotal.setText(decimal.format(0.00));
            produto = null;
            Utilitario.limparTodosCampos(rootPane);
            dav = new DavCabecalho();
            numDAV = null;
        }
    }

    private void selecionaCliente() {
        BuscaCliente BC = new BuscaCliente(null, true);
        BC.setVisible(true);
        Cliente cli = BC.getCliente();
        if (cli != null) {
            textCPFCNPJ.setText(cli.getCpfCnpj());
            textNomeCLiente.setText(cli.getNome());
        } else {
            textCPFCNPJ.setText("");
            textNomeCLiente.setText("");
        }
    }

    /**
     ***************************************************************************
     *******************************PRE-VENDA***********************************
     * *************************************************************************
     */
    private void finalizaPRE_VENDA() {
        Integer idDavAlteracao;
        if (preVenda != null) {
            idDavAlteracao = preVenda.getId();
            if (idDavAlteracao != null) {
                PreVendaCabecalho d = PreVendaCabecalhoControler.retornaPreVendaPorId(idDavAlteracao);
                if (d != null) {
                    d.delete();
                }
            }
        }
        AbstractTableModel modelo = (AbstractTableModel) jTable1.getModel();
        preVenda = new PreVendaCabecalho();
        preVenda.setDataPv(new Date());
        preVenda.setHoraPv(hora.format(time));
        preVenda.setSituacao('P');
        Cliente cliente = ClienteControler.retornaClientePorCpfCnpj(textCPFCNPJ.getText().trim());
        if (cliente != null) {
            preVenda.setCliente(cliente);
        } else {
            preVenda.setCliente(new Cliente());
        }
        preVenda.setValor(totalVenda);

        //itens da pre-venda
        for (int x = 0; x < jTable1.getRowCount(); x++) {
            PreVendaDetalhe pvDet = new PreVendaDetalhe();
            String idProduto = ((String) modelo.getValueAt(x, 0));//id do produto
            String qtd = ((String) modelo.getValueAt(x, 5));//quantidade
            String vlrUnit = ((String) modelo.getValueAt(x, 4)).replace("R$ ", "").trim();//quantidade
            BigDecimal vlrUnitario = new BigDecimal(vlrUnit.replace(".", "").replace(",", "."));
            //setando as informaçãoes
            pvDet.setIdEcfPreVendaCabecalho(preVenda);
            Produto prod = ProdutoControler.retornaProdutoPorId(Integer.parseInt(idProduto));
            pvDet.setIdProduto(prod);
            pvDet.setQuantidade(new BigDecimal(qtd));
            pvDet.setValorUnitario(vlrUnitario);
            pvDet.setValorTotal(vlrUnitario.multiply(new BigDecimal(qtd)));
            preVenda.getItensPreVenda().add(pvDet);
        }
        preVenda = preVenda.salvar();

        //removendo itens da tabela
        limpaTabela();
        //inicializando Objetos
        totalVenda = new BigDecimal(0);
        textTotal.setText(decimal.format(0.00));
        produto = null;
        Utilitario.limparTodosCampos(rootPane);

        JOptionPane.showMessageDialog(null, "Pré-Venda Número: " + preVenda.getId());
        preVenda = new PreVendaCabecalho();
    }

    private void adicionaProdutoAlterandoPreVenda(List<PreVendaDetalhe> list) {
        limpaTabela();
        NumberFormat decimais = NumberFormat.getInstance();
        DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
        if (!list.isEmpty()) {
            for (PreVendaDetalhe prod : list) {
                Produto p = ProdutoControler.retornaProdutoPorId(prod.getIdProduto().getId());
                modelo.addRow(new String[]{p.getId().toString(),
                            p.getGtin(),
                            p.getCodigoInterno().toString(),
                            p.getDescricao(),
                            decimal.format(prod.getValorUnitario()).toString(),
                            decimais.format(prod.getQuantidade()).toString(),
                            decimal.format(prod.getValorUnitario().multiply(prod.getQuantidade())).toString(),
                            p.getIdUnidadeProduto().getNome()});
                totalVenda = totalVenda.add(prod.getValorTotal());
                textTotal.setText(decimal.format(totalVenda));
            }
        }

        textGtin.requestFocus();
        if (totalVenda.intValue() > 0) {
            btConfirma.setEnabled(true);
        } else {
            btConfirma.setEnabled(false);
        }
    }
}
